﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CPPEI.WebApiTool
{
    public class PageDocBuilder
    {
        StringBuilder _stringBuilder = new StringBuilder();

        DScenario _scenario;
        DAction _action;

        public PageDocBuilder(DScenario scenario, DAction action)
        {
            _scenario = scenario;
            _action = action;
        }

        public void Build(string filePath, string apiUrl)
        {
            Begin();
            OnBuildSummary(apiUrl);

            _stringBuilder.AppendLine("<div>");
            
            OnBuildSummary2();

            OnBuildSysParameters();

            OnBuildOpParameters();
            
            OnBuildCommonResults();

            OnBuildResults();
            _stringBuilder.AppendLine("</div>");

            End();
            File.WriteAllText(filePath, _stringBuilder.ToString());
        }

        private void Begin()
        {
            _stringBuilder.AppendLine("<!DOCTYPE html>");
            _stringBuilder.AppendLine("<html xmlns=\"http://www.w3.org/1999/xhtml\">");

            OnBuildHead();

            _stringBuilder.AppendLine("<body>");
        }

        private void End()
        {
            _stringBuilder.AppendLine("</body>");
            _stringBuilder.AppendLine("</html>");
        }

        private void OnBuildHead()
        {
            _stringBuilder.AppendLine("<head>");
            _stringBuilder.AppendLine("<meta http-equiv=\"Cache\" content=\"no-cache\" />");
            _stringBuilder.AppendLine("<meta charset=\"utf-8\"/>");
            _stringBuilder.AppendFormat("<title>[{0}]-{1}</title>", _scenario.Name, _action.Name);
            _stringBuilder.AppendLine("<link href=\"../css/style.css\" rel=\"stylesheet\" />");
            _stringBuilder.AppendLine("</head>");
        }

        private void OnBuildSummary(string apiUrl)
        {
            _stringBuilder.AppendLine("<div>");
            _stringBuilder.AppendFormat("<h1>[{0}]-{1}</h1>", _scenario.Name, _action.Name);
            _stringBuilder.AppendFormat("地址 : {0}", apiUrl);
            _stringBuilder.AppendLine("<br />");
            _stringBuilder.AppendFormat("调用方式: {0}", _action.HttpMethod);
            _stringBuilder.AppendLine("<br />");
            _stringBuilder.AppendLine("<a href=\"#sysemparameters\">系统参数</a>");
            _stringBuilder.AppendLine("<a href=\"#operationparameters\">操作参数</a>");
            _stringBuilder.AppendLine("<a href=\"#result\">返回结果</a>");
            _stringBuilder.AppendLine("<a href=\"#result_data\">Data</a>");
            //_stringBuilder.AppendFormat("<a href=\"../Test/{0}_{1}.html\" target=\"_blank\">示例</a>", _scenario.Name, _action.Name);
            _stringBuilder.AppendLine("</div>");
        }

        private void OnBuildSummary2()
        {
            _stringBuilder.AppendLine("<h2 id=\"summary\">描述</h2>");
            _stringBuilder.AppendLine("<p>");
            if(!string.IsNullOrEmpty(_action.Description))
            {
                _stringBuilder.AppendLine(_action.Description);
            }
            else
            {
                _stringBuilder.AppendLine("&nbsp;");
            }
            _stringBuilder.AppendLine("</p>");
        }

        private void OnBuildSysParameters()
        {
            _stringBuilder.AppendLine("<h2 id=\"sysemparameters\">系统参数</h2>");
            _stringBuilder.AppendLine("<table class=\"def_table\">");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendLine("<th class=\"c_name\">Name");
            _stringBuilder.AppendLine("</th>");
            _stringBuilder.AppendLine("<th class=\"c_type\">Type");
            _stringBuilder.AppendLine("</th>");
            _stringBuilder.AppendLine("<th class=\"c_defaultvalue\">DefaultValue");
            _stringBuilder.AppendLine("</th>");
            _stringBuilder.AppendLine("<th class=\"c_description\">Decription");
            _stringBuilder.AppendLine("</th>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendLine("<td>");
            _stringBuilder.AppendLine("sys:sno");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>");
            _stringBuilder.AppendLine("string");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>");
            _stringBuilder.AppendFormat("{0}", _scenario.Name);
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>");
            _stringBuilder.AppendLine("场景码");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendLine("<td>sys:act");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>string");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendFormat("<td>{0}", _action.Name);
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>操作命令");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("</table>");
        }

        private void OnBuildOpParameters()
        {
            foreach (var param in _action.Parameters)
            {
                _stringBuilder.AppendFormat("<h2 id=\"result\">操作参数{0}</h2>", param.Name);
                _stringBuilder.AppendLine("<table class=\"def_table\">");
                _stringBuilder.AppendLine("<tr>");
                _stringBuilder.AppendLine("<th class=\"c_name\">Name");
                _stringBuilder.AppendLine("</th>");
                _stringBuilder.AppendLine("<th class=\"c_type\">Type"); ;
                _stringBuilder.AppendLine("<th class=\"c_description\">Decription");
                _stringBuilder.AppendLine("</th>");
                _stringBuilder.AppendLine("</tr>");

                foreach (var item in param.Items)
                {
                    _stringBuilder.AppendLine("<tr>");
                    _stringBuilder.AppendLine("<td>");
                    _stringBuilder.AppendFormat("{0}", Util.ResolveProperty(item.Name));
                    _stringBuilder.AppendLine("</td>");
                    _stringBuilder.AppendLine("<td>");
                    _stringBuilder.AppendFormat("{0}", item.TypeString);
                    _stringBuilder.AppendLine("</td>");
                    _stringBuilder.AppendLine("<td>");
                    _stringBuilder.AppendFormat("{0}", item.Description);
                    _stringBuilder.AppendLine("</td>");
                    _stringBuilder.AppendLine("</tr>");
                }
                _stringBuilder.AppendLine("</table>");
            }
        }

        private void OnBuildCommonResults()
        {
            _stringBuilder.AppendLine("<h2 id=\"result\">返回结果</h2>");
            _stringBuilder.AppendLine("<table class=\"def_table\">");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendLine("<th class=\"c_name\">Name");
            _stringBuilder.AppendLine("</th>");
            _stringBuilder.AppendLine("<th class=\"c_type\">Type");
            _stringBuilder.AppendLine("<th class=\"c_description\">Decription");
            _stringBuilder.AppendLine("</th>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendFormat("<td>{0}", Util.ResolveProperty("IsSuccess"));
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>bool");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>是否操作成功");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendFormat("<td>{0}", Util.ResolveProperty("ErrorCode"));
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>int");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>错误码");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendFormat("<td>{0}", Util.ResolveProperty("Message"));
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>string");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>错误消息");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("<tr>");
            _stringBuilder.AppendFormat("<td>{0}", Util.ResolveProperty("Data"));
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>object");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("<td>数据结果");
            _stringBuilder.AppendLine("</td>");
            _stringBuilder.AppendLine("</tr>");
            _stringBuilder.AppendLine("</table>");
        }

        private void OnBuildResults()
        {
            foreach (var result in _action.Results)
            {
                _stringBuilder.AppendFormat("<h2 id=\"result\">返回结果{0}</h2>", result.Name);
                _stringBuilder.AppendLine("<table class=\"def_table\">");
                _stringBuilder.AppendLine("<tr>");
                _stringBuilder.AppendLine("<th class=\"c_name\">Name");
                _stringBuilder.AppendLine("</th>");
                _stringBuilder.AppendLine("<th class=\"c_type\">Type");;
                _stringBuilder.AppendLine("<th class=\"c_description\">Decription");
                _stringBuilder.AppendLine("</th>");
                _stringBuilder.AppendLine("</tr>");

                foreach (var item in result.Items)
                {
                    _stringBuilder.AppendLine("<tr>");
                    _stringBuilder.AppendLine("<td>");
                    _stringBuilder.AppendFormat("{0}", Util.ResolveProperty(item.Name));
                    _stringBuilder.AppendLine("</td>");
                    _stringBuilder.AppendLine("<td>");
                    _stringBuilder.AppendFormat("{0}", item.TypeString);
                    _stringBuilder.AppendLine("</td>");
                    _stringBuilder.AppendLine("<td>");
                    _stringBuilder.AppendFormat("{0}", item.Description);
                    _stringBuilder.AppendLine("</td>");
                    _stringBuilder.AppendLine("</tr>");
                }
                _stringBuilder.AppendLine("</table>");
            }
        }
    }
}
